#!/bin/bash

#
## Global arrayHash Declare
#
system::arrayHash() {
    local hashName=${1:?"[${FUNCNAME}] 需要数组名称参数！"'$1:hashName 数组名称' }
    [[ -n $(system::filterVariableChar $hashName) ]] && test ${9:?"[${FUNCNAME}] 数组名称包含特殊字符！"'$1:hashName 数组名称只能包含[下划线，数值，字母]}' }

    local arrayTemplates=()

    #size()获取ArrayHash的数组size
    arrayTemplates=("${arrayTemplates[@]}" '
        function @hash:size() {
            if test ${#} -eq 0; then
                echo "${#@hash[@]}"
            else
                test ${#@hash[@]} ${@}
            fi
        }'
    )

    #containsKey()模式匹配Hash中的key，若是匹配成功，则输出key
    arrayTemplates=("${arrayTemplates[@]}" '
        function @hash:containsKey() {
            local element=${1:?"[${FUNCNAME}] 需要key匹配模式参数！\$1:element key匹配模式参数" }

            for i in ${!@hash[@]}; do
                [[ ${i} =~ ${1} ]] && echo "${i}"
            done
        }'
    )

    #containsValue()模式匹配Hash中的value，若是匹配成功，则输出value
    arrayTemplates=("${arrayTemplates[@]}" '
        function @hash:containsValue() {
            local element=${1:?"[${FUNCNAME}] 需要匹配模式参数！\$1:element 匹配模式参数" }

            for i in ${@hash[*]}; do
                [[ ${i} =~ ${1} ]] && echo "${i}"
            done
        }'
    )

    #put()向ArrayHash中追加新元素
    arrayTemplates=("${arrayTemplates[@]}" '
        function @hash:put() {
            local key=${1:?"[${FUNCNAME}] 需要key参数！\$1:key 字典参数" }
            local value=${2:?"[${FUNCNAME}] 需要value参数！\$2:value 数值参数" }

            while [[ ${#} -gt 0 ]]; do
                @hash["$key"]="$value"
                shift 2
            done
        }'
    )

    #remove()删除ArrayHash中指定key的元素
    arrayTemplates=("${arrayTemplates[@]}" '
        function @hash:remove() {
            local key=${1:?"[${FUNCNAME}] 需要key参数！\$1:key 字典参数" }

            unset @hash[${1}]
        }'
    )

    #keys()遍历ArrayHash中所有元素
    arrayTemplates=("${arrayTemplates[@]}" '
        function @hash:keys() {
            echo "${!@hash[*]}"
        }'
    )

    #values()遍历ArrayHash中所有元素
    arrayTemplates=("${arrayTemplates[@]}" '
        function @hash:values() {
            echo "${@hash[*]}"
        }'
    )

    logger::debug ${FUNCNAME} "开始构建ArrayHash对象："${hashName}
    eval "declare -Ag ${hashName}; ${hashName}=()"

    for template in ${!arrayTemplates[@]}; do
        eval "${arrayTemplates[$template]//@hash/$hashName}"
    done
}
